var viewer;//全局cesium对象 var mancarHeight;//车辆和人员定位的临时高度,有三维模型的,用clamptoheight替代 var base3dtilesPrimitives = [];//3dtiles实景三维数据底图数据 var tilesUrl;//多质量等级三维地图数据集 var modelMatrixData;//多质量等级三维地图数据集的位置移动矩阵 var initView;//初始位置数据集 var googleimageryProvider; var tdtannoimageryProvider; var googleimagery; var tdtannoimagery; var tdtimagery; var tdtvectorimagery; var tdtvectoranoimagery; var arcgisProvider; var localimagery; var cur_height;//当前高度 var cur_west; var cur_east; var cur_south; var cur_north; const minHeight=1000; var ug;//地下模式 var is_ug_open=0; var baseShPrimitives=[]; function initmap3D(mapOptions){ var tdtimganourl = "http://t0.tianditu.gov.cn/cia_w/wmts?service=wmts&request=GetTile" +"&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}" +"&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg" +"&tk=3fd07756862125febfd7b53271a90dbd"; //天地图影像注记 tdtannoimageryProvider = new Cesium.WebMapTileServiceImageryProvider({ url: tdtimganourl, layer: "tdtimganoLayer", // layer: "tdtAnnoLayer" ,//注记 style: "default", format: "image/jpeg", tileMatrixSetID: "GoogleMapsCompatible", show: false }); var tdtvecurl = "http://t0.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile" +"&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={TileMatrix}" +"&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg" +"&tk=3fd07756862125febfd7b53271a90dbd"; //天地图二维底图 var tdtvectorProvider = new Cesium.WebMapTileServiceImageryProvider({ url: tdtvecurl, layer: "tdtvecLayer", style: "default", format: "image/jpeg", tileMatrixSetID: "GoogleMapsCompatible", show: false, }); var tdtvecanourl = "http://t0.tianditu.gov.cn/cva_w/wmts?service=wmts&request=GetTile" +"&version=1.0.0&LAYER=cva&tileMatrixSet=w&TileMatrix={TileMatrix}" +"&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg" +"&tk=3fd07756862125febfd7b53271a90dbd"; //天地图二维底图注记 var tdtvectoranoProvider = new Cesium.WebMapTileServiceImageryProvider({ url: tdtvecanourl, layer: "tdtvecLayer", style: "default", format: "image/jpeg", tileMatrixSetID: "GoogleMapsCompatible", show: false }); //谷歌网络影像 googleimageryProvider = new Cesium.UrlTemplateImageryProvider({ // url:"http://mt1.google.cn/vt/lyrs=s&hl=zh-CN&x={x}&y={y}&z={z}&s=Gali", url:'http://www.google.cn/maps/vt?lyrs=s@800&x={x}&y={y}&z={z}', tilingScheme:new Cesium.WebMercatorTilingScheme(), minimumLevel:1, maximumLevel:20 }); //天地图影像服务,质量太差,如无特殊要求就不用 var tdtimgurl = "http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile" +"&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles" +"&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}&" +"tk=3fd07756862125febfd7b53271a90dbd" var tdtimageryProvider = new Cesium.WebMapTileServiceImageryProvider({ url: tdtimgurl, layer: "tdtimgLayer", style: "default", format: "image/jpeg", tileMatrixSetID: "GoogleMapsCompatible", show: true }); arcgisProvider=new Cesium.ArcGisMapServerImageryProvider({ url : 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer' }); googleimagery = new Cesium.ImageryLayer(googleimageryProvider, {}); tdtimagery = new Cesium.ImageryLayer(tdtimageryProvider, {}); tdtannoimagery = new Cesium.ImageryLayer(tdtannoimageryProvider, {}); tdtvectorimagery = new Cesium.ImageryLayer(tdtvectorProvider, {}); tdtvectoranoimagery = new Cesium.ImageryLayer(tdtvectoranoProvider, {}); // localimagery = new Cesium.ImageryLayer(localimageryProvider, {}); //cesium全球30米分辨率地形资源token Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI0NjBlYzRiYS0wMDRhL' +'TRjZWYtODJhOS1jZTk5ZmI4ZDg5ZTIiLCJpZCI6ODI1MCwic2NvcGVzIjpbImFzciIsImdjIl0sImlhdCI6MTU1MTU3M' +'DU1Mn0.yfJ_i4EPiunFj_qUftuv1ksx4pUNgnPC16vQCBGrM08'; //初始化三维场景 viewer = new Cesium.Viewer('cesiumContainer',{ fullscreenButton:false, homeButton:false, timeline:true, geocoder:false, scene3DOnly:true, sceneModePicker:false, baseLayerPicker:false, shouldAnimate:true, navigationHelpButton:false, //imageryProvider:googleimageryProvider, imageryProvider:tdtannoimageryProvider, //imageryProvider:arcgisProvider, terrainProvider:Cesium.createWorldTerrain({requestWaterMask:true}), terrainExaggeration:Number($('#terrainEx').val()) }); viewer.imageryLayers.add(tdtimagery); //viewer.imageryLayers.addImageryProvider(arcgisProvider); viewer.imageryLayers.addImageryProvider(tdtannoimageryProvider); //viewer.imageryLayers.addImageryProvider(googleimageryProvider); viewer.scene.globe.depthTestAgainstTerrain = true; viewer.scene._hdr = false; viewer.scene.fxaa = false; viewer.scene.globe.maximumScreenSpaceError = 6/3; viewer.scene.postProcessStages.fxaa.enabled=false; // viewer.scene.screenSpaceCameraController.enableCollisionDetection = enable; // viewer.scene.globe.translucency.frontFaceAlpha = alpha; //地图灰度系数 var layer0 = viewer.scene.imageryLayers.get(0); layer0.gamma = 0.66; // viewer.scene.globe.enableLighting = true//必须开启光照效果 //加载导航工具 var navOptions = {}; navOptions.defaultResetView = Cesium.Rectangle.fromDegrees( mapOptions.initView.lon-0.01, mapOptions.initView.lat-0.01, mapOptions.initView.lon+0.01, mapOptions.initView.lat+0.01); navOptions.enableCompass = true; navOptions.enableZoomControls = true; navOptions.enableDistanceLegend = true; navOptions.enableCompassOuterRing = true; viewer.extend(Cesium.viewerCesiumNavigationMixin, navOptions);//加入导航工具扩展 viewer.extend(Cesium.xbsjGroundPrimitiveMixin);//加入贴地纹理扩展 tilesUrl = mapOptions.tilesUrl; modelMatrixData = mapOptions.modelMatrixData; //add3dtilesmap('hquality'); initView = mapOptions.initView; wholeView(); if(mapOptions.water!=undefined&&mapOptions.water!=[]){ createWater(mapOptions.water); } //切换地下模式 ug = new underground(viewer, { depth : 5000, alpha : 0.66 }) // ug.activate(); // mancarHeight = mapOptions.mancarHeight; //初始化项目点 //initProject(); var previousPickedEntity = { feature: undefined, originalColor: undefined }; var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function (movement) { var pick = viewer.scene.pick(movement.position); if (pick instanceof Cesium.Cesium3DTileFeature) { var propertyNames = pick.getPropertyNames(); var length = propertyNames.length; var content=""; for (var i = 0; i < length; ++i) { var propertyName = propertyNames[i]; content += propertyName + ': ' + pick.getProperty(propertyName)+'
' } layer.msg(content); //判断以前是否选择要素 if (pick != previousPickedEntity.feature) { if (previousPickedEntity.feature != undefined) { //还原前选择要素的本颜色 previousPickedEntity.feature.color = previousPickedEntity.originalColor; //将当前选择要素及其颜色添加到previousPickedEntity previousPickedEntity.feature = pick; previousPickedEntity.originalColor = pick.color; } //将当前选择要素及其颜色添加到previousPickedEntity previousPickedEntity.feature = pick; previousPickedEntity.originalColor = pick.color; } //将模型变为黄色高亮 pick.color = Cesium.Color.YELLOW; } else if (Cesium.defined(pick) && Cesium.defined(pick.id.id) && pick.id.id.indexOf("project_")!= -1 ) { var id=pick.id.id; var id2=parseInt(id.substring(8)); showProjectTables(id2); } else if(Cesium.defined(pick) && Cesium.defined(pick.id.id) && pick.id.id.indexOf("pm25_")!= -1){ var id=pick.id.id; var jData={"id":1}; layer.open({ type: 2, title: "传感器编号:"+id+"氨气数据展示", maxmin: true, shade: 0, maxmin:false, scrollbar: false, offset: 'rt', shadeClose: false, //点击遮罩关闭层 area : ['600px' , '350px'], resize:false, content: 'smelldata/smellChart.html', success: function (layero, index) { var iframe = window['layui-layer-iframe' + index];//拿到iframe元素 iframe.child(JSON.stringify(1))//向此iframe层方法 传递参数 } }); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); //双击事件 var handlerDoubleClick = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handlerDoubleClick.setInputAction(function (movement) { var pick = viewer.scene.pick(movement.position); }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); //鼠标小手状态 var handlerMouseMove=new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handlerMouseMove.setInputAction(function (movement) { var pick = viewer.scene.pick(movement.endPosition); if (Cesium.defined(pick)) { viewer._container.style.cursor = "pointer"; } else{ viewer._container.style.cursor = "default"; } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); } function openUg(){ ug.activate(); is_ug_open=1; } function closeUg(){ ug.disable(); is_ug_open=0; } //移除地图上的采样数据 function removeSample(){ var entitys = viewer.entities._entities._array; for (var i = 0; i < entitys.length; i++) { if (entitys[i]._id.indexOf("sampleEvent_")!=-1 ||entitys[i]._id.indexOf("samplePlan_")!=-1) { viewer.entities.remove(entitys[i]); i--; } } } //移除项目点 function removeProject(){ var entitys = viewer.entities._entities._array; for (var i = 0; i < entitys.length; i++) { if (entitys[i]._id.indexOf("project_")!=-1) { viewer.entities.remove(entitys[i]); i--; } } } //初始化项目点 function initProject(){ for(var i=0;i= 20", "rgba(255, 182, 193, 1.0)"], ["${floor} >= 15", "rgb(102, 71, 151)"], ["${floor} >= 13", "rgb(170, 162, 204)"], ["${floor} >= 12", "rgb(224, 226, 238)"], ["${floor} >= 10", "rgb(252, 230, 200)"], ["${floor} >= 8", "rgb(248, 176, 87)"], ["${floor} >= 6", "rgb(198, 106, 11)"], ["true", "rgb(127, 59, 8)"], ], } }); } //加载3dtiles数据 base3dtilesPrimitives.push(viewer.scene.primitives.add(tileset)); } } function randomRgbaColor() { //随机生成RGBA颜色 var r = Math.floor(Math.random() * 256); //随机生成256以内r值 var g = Math.floor(Math.random() * 256); //随机生成256以内g值 var b = Math.floor(Math.random() * 256); //随机生成256以内b值 var alpha = Math.random(); //随机生成1以内a值 return "rgba(" + r + "," + g + "," + b +","+ 1 + ")"; //返回rgba(r,g,b,a)格式颜色 } function addBusTest(){ var url="../assets/bus2.gltf"; var lng= 116.3930,lat= 39.9128,height= 50.0, scale = 3.0 ; addGltf(url,lng,lat,height,scale); } function addBusTest2(){ var url="../assets/bus2.gltf"; var lng= 116.3939,lat= 39.9058,height= 100.0, scale = 5.0 ; addGltf(url,lng,lat,height,scale); } function addBusTest3(){ var url="../assets/bus2.gltf"; var lng= 116.3986,lat= 39.9070,height=100.0, scale = 5.0 ; addGltf(url,lng,lat,height,scale); } function addGltf(url,lng,lat,height,scale){ var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(lng, lat,height)); var model=viewer.scene.primitives.add(Cesium.Model.fromGltf({ url : url, //如果为bgltf则为.bgltf modelMatrix : modelMatrix, scale : scale, //放大倍数 })); let m = model.modelMatrix; //构建一个三阶旋转矩阵。模型旋转一定的角度,fromRotation[Z]来控制旋转轴,toRadians()为旋转角度,转为弧度再参与运算 let m1 = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(-78)); //矩阵计算 Cesium.Matrix4.multiplyByMatrix3(m,m1,m); //将计算结果再赋值给modelMatrix model.modelMatrix = m; } function add3DtileJson(url,lng,lat,height,head,pitch,roll,scaleparam){ var modelMatrix = Cesium.Matrix4.fromArray([ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ]); var tilesetOption = { url: url, maximumScreenSpaceError: 1, maximumNumberOfLoadedTiles: 2000, maximumMemoryUsage: 8192, skipLevels: 1, modelMatrix: modelMatrix//引入转移矩阵 }; var tileset = new Cesium.Cesium3DTileset(tilesetOption); let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(head)); let my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(pitch)); let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(roll)); let rotationX = Cesium.Matrix4.fromRotationTranslation(mx); let rotationY = Cesium.Matrix4.fromRotationTranslation(my); let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz); //平移 let position = Cesium.Cartesian3.fromDegrees(lng, lat, params.height); let m = Cesium.Transforms.eastNorthUpToFixedFrame(position); let scale = Cesium.Matrix4.fromUniformScale(scaleparam); // //缩放 Cesium.Matrix4.multiply(m, scale, m); //旋转、平移矩阵相乘 Cesium.Matrix4.multiply(m, rotationX, m); Cesium.Matrix4.multiply(m, rotationY, m); Cesium.Matrix4.multiply(m, rotationZ, m); tileset.readyPromise.then(function () { }).then(function () { if (tileset._root.transform == undefined) { console.log("瓦片未变换"); } tileset._root.transform = m; }); base3dtilesPrimitives.push(viewer.scene.primitives.add(tileset)); } //卸载3dtiles实景三维数据底图 function remove3dtilesmap(){ if(base3dtilesPrimitives!=[]){ for ( var i = 0; i < base3dtilesPrimitives.length; i++) { viewer.scene.primitives.remove(base3dtilesPrimitives[i]); } base3dtilesPrimitives = []; } } //创建水体 function createWater(water){ for ( var i = 0; i < water.length; i++) { var waterPmt = new Cesium.Primitive({ geometryInstances : new Cesium.GeometryInstance({ geometry : new Cesium.PolygonGeometry({ polygonHierarchy : new Cesium.PolygonHierarchy( Cesium.Cartesian3.fromDegreesArrayHeights(water[i])), perPositionHeight : true, vertexFormat : Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT }), }), appearance : new Cesium.EllipsoidSurfaceAppearance({ aboveGround : true, }), show : true }); waterPmt.appearance.material = new Cesium.Material({ fabric : { type : 'Water', uniforms : { //specularMap: '../images/earthspec1k.jpg', //normalMap: Cesium.buildModuleUrl('../images/waterNormals.jpg'), frequency: 1000.0, animationSpeed: 0.005, amplitude: 1.0 } } }); viewer.scene.primitives.add(waterPmt); } } //加载街道矢量瓦片数据 function addVectorLayer(){ viewer.imageryLayers.remove(tdtannoimagery,false); viewer.imageryLayers.remove(googleimagery,false); viewer.imageryLayers.remove(tdtimagery,false); viewer.imageryLayers.add(tdtvectorimagery); viewer.imageryLayers.add(tdtvectoranoimagery); } //加载谷歌遥感影像瓦片数据 function addImageLayer(){ viewer.imageryLayers.remove(tdtvectorimagery,false); viewer.imageryLayers.remove(tdtvectoranoimagery,false); viewer.imageryLayers.remove(tdtimagery,false); viewer.imageryLayers.add(googleimagery); viewer.imageryLayers.add(tdtannoimagery); } //加载天地图遥感影像瓦片数据 function addtdtImageLayer(){ viewer.imageryLayers.remove(googleimagery,false); viewer.imageryLayers.remove(tdtvectorimagery,false); viewer.imageryLayers.remove(tdtvectoranoimagery,false); viewer.imageryLayers.add(tdtimagery); viewer.imageryLayers.add(tdtannoimagery); } //切换地形加载 function addWorldTerrain(){ viewer.scene.terrainProvider = Cesium.createWorldTerrain({requestWaterMask:true}); } //本地地形 function addchTerrain(){ var terrainProvider = new Cesium.CesiumTerrainProvider({ url:serverIP + "chineseterrain" }); viewer.scene.terrainProvider = terrainProvider; } //椭球 function addelTerrain(){ viewer.scene.terrainProvider = new Cesium.EllipsoidTerrainProvider({}); } function loadShnangHaigzw(){ var promise = Cesium.GeoJsonDataSource.load('../assets/gzw.json',{ stroke: Cesium.Color.BROWN , fill: Cesium.Color.BROWN }); promise.then(function(dataSource) { viewer.dataSources.add(dataSource); smiplemodeldata = dataSource; var entities = dataSource.entities.values; // var colorHash = {}; for (var i = 0; i < entities.length; i++) { var entity = entities[i]; // var name = entity.properties.name; entity.polygon.heightReference = Cesium.HeightReference.RELATIVE_TO_GROUND; entity.polygon.outline = false; entity.polygon.extrudedHeight = 500; entity.polygon.extrudedHeightReference = Cesium.HeightReference.RELATIVE_TO_GROUND; } }).otherwise(function(error){ swal(error,"请重试!","error"); }); } var smiplemodeldata; function loadsmiplemodel(){ $('#loading').show(); viewer.imageryLayers.remove(tdtannoimagery,false); viewer.imageryLayers.remove(googleimagery,false); viewer.imageryLayers.remove(tdtvectorimagery,false); viewer.imageryLayers.remove(tdtvectoranoimagery,false); viewer.imageryLayers.add(localimagery); var promise = Cesium.GeoJsonDataSource.load('../../easy3dfile/data/buildings/buildings_haerbin.json'); promise.then(function(dataSource) { viewer.dataSources.add(dataSource); smiplemodeldata = dataSource; var entities = dataSource.entities.values; var colorHash = {}; for (var i = 0; i < entities.length; i++) { var entity = entities[i]; var name = entity.properties.name; var color; color = Cesium.Color.DEEPSKYBLUE.withAlpha(1.0); entity.polygon.outline = false; var alphamaterial = new Cesium.Material({ fabric: { type: 'Image', uniforms: { image: '../images/building.png', }, } }); entity.polygon.material = alphamaterial; entity.polygon.heightReference = Cesium.HeightReference.RELATIVE_TO_GROUND; entity.polygon.extrudedHeight = 0.0; entity.polygon.extrudedHeightReference = Cesium.HeightReference.CLAMP_TO_GROUND; } $('#loading').hide(); }).otherwise(function(error){ swal(error,"请重试!","error"); }); viewer.camera.flyTo({ destination : Cesium.Cartesian3.fromDegrees(126.60329039879346,45.74025270878488, 500), orientation : { heading : Cesium.Math.toRadians(0.0), pitch : Cesium.Math.toRadians(-20.0), roll : 0.0 } }); addPOMListener(); } function removesmiplemodel(){ viewer.dataSources.remove(smiplemodeldata); viewer.imageryLayers.remove(localimagery,false); viewer.imageryLayers.add(tdtannoimagery); viewer.imageryLayers.add(googleimagery); } //交通流动线 var roadodline; function addODlines(){ var lineheight = 15; if(isTerrainShow){ lineheight = 1000; } var odOption = { viewer: viewer, geoJsonUrl: '../../easy3dfile/data/map/road.geojson', linecolor: Cesium.Color.GOLD,//ORANGE;//ORANGE;//GOLD;//底线颜色 linewidth: 6.0,//底线宽度 lineheight: lineheight,//底线高度 lineglow: 0.15,//底线光晕宽度 tracecolor: Cesium.Color.WHITE,//ORANGE;//GOLD;//尾迹线颜色 tracewidth: 28.0,//尾迹线宽度 timeDuration: 1.0,//各个尾迹线发出的时间间隔 moveBaseDuration: 2.0,//各个尾迹线的速度,数值越大越慢 }; roadodline = CesiumODline.loadGeoJson(odOption); } function removeODlines(){ CesiumODline.removeJson(viewer); } /***************************上:加载基础三维地图;下:地图工具*************************/ //添加重点地名地址标记,数据来源:@baseMapLabelData.js var importantLableArr = [];//重点地名地址标记数组 function showImportantLable(){ //计算当前城市的经纬度与米的换算比 if(tmRoadLable.length!=0){ var yPerimeter = 40075016.68557849; var curlat = Number(tmRoadLable[0].position[1].toString().split('.')[0])*Math.PI/180; var xPerimeter = yPerimeter * Math.cos(curlat); var yperi = 360/yPerimeter; var xperi = 360/xPerimeter; //显示重要道路标记 for (var i=0;i